home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacOS 8 Resources / Developer Tools / Mac OS 8 Interfaces & Libraries / Interfaces / CIncludes / MIDI.h < prev    next >
C/C++ Source or Header  |  1996-05-01  |  20KB  |  501 lines

  1. /*
  2.      File:        MIDI.h
  3.  
  4.      Contains:    MIDI Manager Interfaces.
  5.  
  6.      Version:    Technology:    System 7.5
  7.                  Release:    Universal Interfaces 3.0d3 on Copland DR1
  8.  
  9.      Copyright:    © 1984-1996 by Apple Computer, Inc.  All rights reserved.
  10.  
  11.      Bugs?:        If you find a problem with this file, send the file and version
  12.                  information (from above) and the problem description to:
  13.  
  14.                      Internet:    apple.bugs@applelink.apple.com
  15.                      AppleLink:    APPLE.BUGS
  16.  
  17. */
  18. #ifndef __MIDI__
  19. #define __MIDI__
  20.  
  21. #ifndef __ERRORS__
  22. #include <Errors.h>
  23. #endif
  24. #ifndef __TYPES__
  25. #include <Types.h>
  26. #endif
  27. #ifndef __MIXEDMODE__
  28. #include <MixedMode.h>
  29. #endif
  30.  
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34.  
  35. #if PRAGMA_IMPORT_SUPPORTED
  36. #pragma import on
  37. #endif
  38.  
  39. #if PRAGMA_ALIGN_SUPPORTED
  40. #pragma options align=mac68k
  41. #endif
  42.  
  43. #if FOR_SYSTEM7_ONLY
  44. /*
  45.                         * * *  N O T E  * * * 
  46.  
  47.     This file has been updated to include MIDI 2.0 interfaces.  
  48.     
  49.     The MIDI 2.0 interfaces were developed for the classic 68K runtime.
  50.     Since then, Apple has created the PowerPC and CFM 68K runtimes.
  51.     Currently, the extra functions in MIDI 2.0 are not in InterfaceLib
  52.     and thus not callable from PowerPC and CFM 68K runtimes (you'll
  53.     get a linker error).  
  54. */
  55.  
  56. enum {
  57.     midiMaxNameLen                = 31,                            /*maximum number of characters in port and client names*/
  58.                                                                 /* Time formats */
  59.     midiFormatMSec                = 0,                            /*milliseconds*/
  60.     midiFormatBeats                = 1,                            /*beats*/
  61.     midiFormat24fpsBit            = 2,                            /*24 frames/sec.*/
  62.     midiFormat25fpsBit            = 3,                            /*25 frames/sec.*/
  63.     midiFormat30fpsDBit            = 4,                            /*30 frames/sec. drop-frame*/
  64.     midiFormat30fpsBit            = 5,                            /*30 frames/sec.*/
  65.     midiFormat24fpsQF            = 6,                            /*24 frames/sec. longInt format */
  66.     midiFormat25fpsQF            = 7,                            /*25 frames/sec. longInt format */
  67.     midiFormat30fpsDQF            = 8,                            /*30 frames/sec. drop-frame longInt format */
  68.     midiFormat30fpsQF            = 9,                            /*30 frames/sec. longInt format */
  69.     midiInternalSync            = 0,                            /*internal sync*/
  70.     midiExternalSync            = 1,                            /*external sync*/
  71.                                                                 /* Port types*/
  72.     midiPortTypeTime            = 0,                            /*time port*/
  73.     midiPortTypeInput            = 1,                            /*input port*/
  74.     midiPortTypeOutput            = 2,                            /*output port*/
  75.     midiPortTypeTimeInv            = 3,                            /*invisible time port*/
  76.     midiPortInvisible            = 0x8000,                        /*logical OR this to other types to make invisible ports*/
  77.     midiPortTypeMask            = 0x0007,                        /*logical AND with this to convert new port types to old,*/
  78.                                                                 /*ie. to strip the property bits*/
  79.                                                                 /* OffsetTimes  */
  80.     midiGetEverything            = 0x7FFFFFFF,                    /*get all packets, regardless of time stamps*/
  81.     midiGetNothing                = 0x80000000,                    /*get no packets, regardless of time stamps*/
  82.     midiGetCurrent                = 0x00000000                    /*get current packets only*/
  83. };
  84.  
  85. /*
  86.     MIDI data and messages are passed in MIDIPacket records (see below).
  87.     The first byte of every MIDIPacket contains a set of flags
  88.  
  89.     bits 0-1    00 = new MIDIPacket, not continued
  90.                      01 = begining of continued MIDIPacket
  91.                      10 = end of continued MIDIPacket
  92.                      11 = continuation
  93.     bits 2-3     reserved
  94.  
  95.     bits 4-6      000 = packet contains MIDI data
  96.  
  97.                   001 = packet contains MIDI Manager message
  98.  
  99.     bit 7         0 = MIDIPacket has valid stamp
  100.                   1 = stamp with current clock
  101. */
  102.  
  103. enum {
  104.     midiContMask                = 0x03,
  105.     midiNoCont                    = 0x00,
  106.     midiStartCont                = 0x01,
  107.     midiMidCont                    = 0x03,
  108.     midiEndCont                    = 0x02,
  109.     midiTypeMask                = 0x70,
  110.     midiMsgType                    = 0x00,
  111.     midiMgrType                    = 0x10,
  112.     midiTimeStampMask            = 0x80,
  113.     midiTimeStampCurrent        = 0x80,
  114.     midiTimeStampValid            = 0x00,                            /* MIDIPacket command words (the first word in the data field for midiMgrType messages) */
  115.     midiOverflowErr                = 0x0001,
  116.     midiSCCErr                    = 0x0002,
  117.     midiPacketErr                = 0x0003,                        /*all command words less than this value are error indicators*/
  118.     midiMaxErr                    = 0x00FF,                        /* Valid results to be returned by readHooks */
  119.     midiKeepPacket                = 0,
  120.     midiMorePacket                = 1,
  121.     midiNoMorePacket            = 2,
  122.     midiHoldPacket                = 3,                            /* Driver calls */
  123.     midiOpenDriver                = 1,
  124.     midiCloseDriver                = 2
  125. };
  126.  
  127.  
  128. enum {
  129.     mdvrAbortNotesOff            = 0,                            /*abort previous mdvrNotesOff request*/
  130.     mdvrChanNotesOff            = 1,                            /*generate channel note off messages*/
  131.     mdvrAllNotesOff                = 2,                            /*generate all note off messages*/
  132.     mdvrStopOut                    = 0,                            /*stop calling MDVROut temporarily*/
  133.     mdvrStartOut                = 1                                /*resume calling MDVROut*/
  134. };
  135.  
  136. struct MIDIPacket {
  137.     UInt8                             flags;
  138.     UInt8                             len;
  139.     long                             tStamp;
  140.     UInt8                             data[249];
  141. };
  142. typedef struct MIDIPacket MIDIPacket;
  143.  
  144. typedef MIDIPacket *MIDIPacketPtr;
  145. typedef pascal short (*MIDIReadHookProcPtr)(MIDIPacketPtr myPacket, long myRefCon);
  146. typedef pascal void (*MIDITimeProcPtr)(long curTime, long myRefCon);
  147. typedef pascal void (*MIDIConnectionProcPtr)(short refnum, long refcon, short portType, OSType clientID, OSType portID, Boolean connect, short direction);
  148. typedef pascal long (*MDVRCommProcPtr)(short refnum, short request, long refCon);
  149. typedef pascal void (*MDVRTimeCodeProcPtr)(short refnum, short newFormat, long refCon);
  150. typedef pascal void (*MDVRReadProcPtr)(char *midiChars, short length, long refCon);
  151.  
  152. #if GENERATINGCFM
  153. typedef UniversalProcPtr MIDIReadHookUPP;
  154. typedef UniversalProcPtr MIDITimeUPP;
  155. typedef UniversalProcPtr MIDIConnectionUPP;
  156. typedef UniversalProcPtr MDVRCommUPP;
  157. typedef UniversalProcPtr MDVRTimeCodeUPP;
  158. typedef UniversalProcPtr MDVRReadUPP;
  159. #else
  160. typedef MIDIReadHookProcPtr MIDIReadHookUPP;
  161. typedef MIDITimeProcPtr MIDITimeUPP;
  162. typedef MIDIConnectionProcPtr MIDIConnectionUPP;
  163. typedef MDVRCommProcPtr MDVRCommUPP;
  164. typedef MDVRTimeCodeProcPtr MDVRTimeCodeUPP;
  165. typedef MDVRReadProcPtr MDVRReadUPP;
  166. #endif
  167. struct MIDIClkInfo {
  168.     short                             syncType;                    /*synchronization external/internal*/
  169.     long                             curTime;                    /*current value of port's clock*/
  170.     short                             format;                        /*time code format*/
  171. };
  172. typedef struct MIDIClkInfo MIDIClkInfo;
  173.  
  174. struct MIDIIDRec {
  175.     OSType                             clientID;
  176.     OSType                             portID;
  177. };
  178. typedef struct MIDIIDRec MIDIIDRec;
  179.  
  180. struct MIDIPortInfo {
  181.     short                             portType;                    /*type of port*/
  182.     MIDIIDRec                         timeBase;                    /*MIDIIDRec for time base*/
  183.     short                             numConnects;                /*number of connections*/
  184.     MIDIIDRec                         cList[1];                    /*ARRAY [1..numConnects] of MIDIIDRec*/
  185. };
  186. typedef struct MIDIPortInfo MIDIPortInfo;
  187.  
  188. typedef MIDIPortInfo *MIDIPortInfoPtr;
  189. typedef MIDIPortInfoPtr *MIDIPortInfoHdl;
  190. typedef MIDIPortInfoPtr *MIDIPortInfoHandle;
  191. struct MIDIPortParams {
  192.     OSType                             portID;                        /*ID of port, unique within client*/
  193.     short                             portType;                    /*Type of port - input, output, time, etc.*/
  194.     short                             timeBase;                    /*refnum of time base, 0 if none*/
  195.     long                             offsetTime;                    /*offset for current time stamps*/
  196.     MIDIReadHookProcPtr             readHook;                    /*routine to call when input data is valid*/
  197.     long                             refCon;                        /*refcon for port (for client use)*/
  198.     MIDIClkInfo                     initClock;                    /*initial settings for a time base*/
  199.     Str255                             name;                        /*name of the port, This is a real live string, not a ptr.*/
  200. };
  201. typedef struct MIDIPortParams MIDIPortParams;
  202.  
  203. typedef MIDIPortParams *MIDIPortParamsPtr;
  204. struct MIDIIDList {
  205.     short                             numIDs;
  206.     OSType                             list[1];
  207. };
  208. typedef struct MIDIIDList MIDIIDList;
  209.  
  210. typedef MIDIIDList *MIDIIDListPtr;
  211. typedef MIDIIDListPtr *MIDIIDListHdl;
  212. typedef MIDIIDListPtr *MIDIIDListHandle;
  213. /* MDVR Control structs*/
  214. struct MDVRInCtlRec {
  215.     short                             timeCodeClock;                /*refnum of time base for time code*/
  216.     short                             timeCodeFormat;                /*format of time code output*/
  217.     MDVRReadProcPtr                 readProc;                    /*proc to call with intput characters*/
  218.     MDVRCommProcPtr                 commProc;                    /*proc to call for handshaking*/
  219.     long                             refCon;                        /*refCon passed to readProc, commProc*/
  220. };
  221. typedef struct MDVRInCtlRec MDVRInCtlRec;
  222.  
  223. typedef MDVRInCtlRec *MDVRInCtlPtr;
  224. struct MDVROutCtlRec {
  225.     short                             timeCodeClock;                /*time base driven by time code*/
  226.     short                             timeCodeFormat;                /*format of time code to listen to*/
  227.     MDVRTimeCodeProcPtr             timeCodeProc;                /*proc called on time code fmt change*/
  228.     MDVRCommProcPtr                 commProc;                    /*proc called for handshaking*/
  229.     long                             refCon;                        /*refCon passed to timeCodeProc*/
  230.     Boolean                         timeCodeFilter;                /*filter time code if true*/
  231.     UInt8                             padding;                    /*unused pad byte*/
  232.     long                             midiMsgTicks;                /*value of Ticks when MIDI msg rcvd*/
  233.     long                             timeCodeTicks;                /*value of Ticks when time code rcvd*/
  234. };
  235. typedef struct MDVROutCtlRec MDVROutCtlRec;
  236.  
  237. typedef MDVROutCtlRec *MDVROutCtlPtr;
  238. typedef void *MDVRPtr;
  239. extern pascal NumVersion MIDIVersion(void )
  240.  FOURWORDINLINE(0x203C, 0x0000, 0x0004, 0xA800);
  241.  
  242. extern pascal OSErr MIDISignIn(OSType clientID, long refCon, Handle icon, ConstStr255Param name)
  243.  FOURWORDINLINE(0x203C, 0x0004, 0x0004, 0xA800);
  244.  
  245. extern pascal void MIDISignOut(OSType clientID)
  246.  FOURWORDINLINE(0x203C, 0x0008, 0x0004, 0xA800);
  247.  
  248. extern pascal MIDIIDListHandle MIDIGetClients(void )
  249.  FOURWORDINLINE(0x203C, 0x000C, 0x0004, 0xA800);
  250.  
  251. extern pascal void MIDIGetClientName(OSType clientID, Str255 name)
  252.  FOURWORDINLINE(0x203C, 0x0010, 0x0004, 0xA800);
  253.  
  254. extern pascal void MIDISetClientName(OSType clientID, ConstStr255Param name)
  255.  FOURWORDINLINE(0x203C, 0x0014, 0x0004, 0xA800);
  256.  
  257. extern pascal MIDIIDListHandle MIDIGetPorts(OSType clientID)
  258.  FOURWORDINLINE(0x203C, 0x0018, 0x0004, 0xA800);
  259.  
  260. extern pascal OSErr MIDIAddPort(OSType clientID, short BufSize, short *refnum, MIDIPortParamsPtr init)
  261.  FOURWORDINLINE(0x203C, 0x001C, 0x0004, 0xA800);
  262.  
  263. extern pascal MIDIPortInfoHandle MIDIGetPortInfo(OSType clientID, OSType portID)
  264.  FOURWORDINLINE(0x203C, 0x0020, 0x0004, 0xA800);
  265.  
  266. extern pascal OSErr MIDIConnectData(OSType srcClID, OSType srcPortID, OSType dstClID, OSType dstPortID)
  267.  FOURWORDINLINE(0x203C, 0x0024, 0x0004, 0xA800);
  268.  
  269. extern pascal OSErr MIDIUnConnectData(OSType srcClID, OSType srcPortID, OSType dstClID, OSType dstPortID)
  270.  FOURWORDINLINE(0x203C, 0x0028, 0x0004, 0xA800);
  271.  
  272. extern pascal OSErr MIDIConnectTime(OSType srcClID, OSType srcPortID, OSType dstClID, OSType dstPortID)
  273.  FOURWORDINLINE(0x203C, 0x002C, 0x0004, 0xA800);
  274.  
  275. extern pascal OSErr MIDIUnConnectTime(OSType srcClID, OSType srcPortID, OSType dstClID, OSType dstPortID)
  276.  FOURWORDINLINE(0x203C, 0x0030, 0x0004, 0xA800);
  277.  
  278. extern pascal void MIDIFlush(short refnum)
  279.  FOURWORDINLINE(0x203C, 0x0034, 0x0004, 0xA800);
  280.  
  281. extern pascal ProcPtr MIDIGetReadHook(short refnum)
  282.  FOURWORDINLINE(0x203C, 0x0038, 0x0004, 0xA800);
  283.  
  284. extern pascal void MIDISetReadHook(short refnum, ProcPtr hook)
  285.  FOURWORDINLINE(0x203C, 0x003C, 0x0004, 0xA800);
  286.  
  287. extern pascal void MIDIGetPortName(OSType clientID, OSType portID, Str255 name)
  288.  FOURWORDINLINE(0x203C, 0x0040, 0x0004, 0xA800);
  289.  
  290. extern pascal void MIDISetPortName(OSType clientID, OSType portID, ConstStr255Param name)
  291.  FOURWORDINLINE(0x203C, 0x0044, 0x0004, 0xA800);
  292.  
  293. extern pascal void MIDIWakeUp(short refnum, long time, long period, MIDITimeProcPtr timeProc)
  294.  FOURWORDINLINE(0x203C, 0x0048, 0x0004, 0xA800);
  295.  
  296. extern pascal void MIDIRemovePort(short refnum)
  297.  FOURWORDINLINE(0x203C, 0x004C, 0x0004, 0xA800);
  298.  
  299. extern pascal short MIDIGetSync(short refnum)
  300.  FOURWORDINLINE(0x203C, 0x0050, 0x0004, 0xA800);
  301.  
  302. extern pascal void MIDISetSync(short refnum, short sync)
  303.  FOURWORDINLINE(0x203C, 0x0054, 0x0004, 0xA800);
  304.  
  305. extern pascal long MIDIGetCurTime(short refnum)
  306.  FOURWORDINLINE(0x203C, 0x0058, 0x0004, 0xA800);
  307.  
  308. extern pascal void MIDISetCurTime(short refnum, long time)
  309.  FOURWORDINLINE(0x203C, 0x005C, 0x0004, 0xA800);
  310.  
  311. extern pascal void MIDIStartTime(short refnum)
  312.  FOURWORDINLINE(0x203C, 0x0060, 0x0004, 0xA800);
  313.  
  314. extern pascal void MIDIStopTime(short refnum)
  315.  FOURWORDINLINE(0x203C, 0x0064, 0x0004, 0xA800);
  316.  
  317. extern pascal void MIDIPoll(short refnum, long offsetTime)
  318.  FOURWORDINLINE(0x203C, 0x0068, 0x0004, 0xA800);
  319.  
  320. extern pascal OSErr MIDIWritePacket(short refnum, MIDIPacketPtr packet)
  321.  FOURWORDINLINE(0x203C, 0x006C, 0x0004, 0xA800);
  322.  
  323. extern pascal Boolean MIDIWorldChanged(OSType clientID)
  324.  FOURWORDINLINE(0x203C, 0x0070, 0x0004, 0xA800);
  325.  
  326. extern pascal long MIDIGetOffsetTime(short refnum)
  327.  FOURWORDINLINE(0x203C, 0x0074, 0x0004, 0xA800);
  328.  
  329. extern pascal void MIDISetOffsetTime(short refnum, long offsetTime)
  330.  FOURWORDINLINE(0x203C, 0x0078, 0x0004, 0xA800);
  331.  
  332. extern pascal long MIDIConvertTime(short srcFormat, short dstFormat, long time)
  333.  FOURWORDINLINE(0x203C, 0x007C, 0x0004, 0xA800);
  334.  
  335. extern pascal long MIDIGetRefCon(short refnum)
  336.  FOURWORDINLINE(0x203C, 0x0080, 0x0004, 0xA800);
  337.  
  338. extern pascal void MIDISetRefCon(short refnum, long refCon)
  339.  FOURWORDINLINE(0x203C, 0x0084, 0x0004, 0xA800);
  340.  
  341. extern pascal long MIDIGetClRefCon(OSType clientID)
  342.  FOURWORDINLINE(0x203C, 0x0088, 0x0004, 0xA800);
  343.  
  344. extern pascal void MIDISetClRefCon(OSType clientID, long refCon)
  345.  FOURWORDINLINE(0x203C, 0x008C, 0x0004, 0xA800);
  346.  
  347. extern pascal short MIDIGetTCFormat(short refnum)
  348.  FOURWORDINLINE(0x203C, 0x0090, 0x0004, 0xA800);
  349.  
  350. extern pascal void MIDISetTCFormat(short refnum, short format)
  351.  FOURWORDINLINE(0x203C, 0x0094, 0x0004, 0xA800);
  352.  
  353. extern pascal void MIDISetRunRate(short refnum, short rate, long time)
  354.  FOURWORDINLINE(0x203C, 0x0098, 0x0004, 0xA800);
  355.  
  356. extern pascal Handle MIDIGetClientIcon(OSType clientID)
  357.  FOURWORDINLINE(0x203C, 0x009C, 0x0004, 0xA800);
  358.  
  359. extern pascal ProcPtr MIDICallAddress(short callNum)
  360.  FOURWORDINLINE(0x203C, 0x00A4, 0x0004, 0xA800);
  361.  
  362. extern pascal void MIDISetConnectionProc(short refNum, ProcPtr connectionProc, long refCon)
  363.  FOURWORDINLINE(0x203C, 0x00A8, 0x0004, 0xA800);
  364.  
  365. extern pascal void MIDIGetConnectionProc(short refnum, ProcPtr *connectionProc, long *refCon)
  366.  FOURWORDINLINE(0x203C, 0x00AC, 0x0004, 0xA800);
  367.  
  368. extern pascal void MIDIDiscardPacket(short refnum, MIDIPacketPtr packet)
  369.  FOURWORDINLINE(0x203C, 0x00B0, 0x0004, 0xA800);
  370.  
  371. extern pascal OSErr MDVRSignIn(OSType clientID, long refCon, Handle icon, Str255 name)
  372.  FOURWORDINLINE(0x203C, 0x00B4, 0x0004, 0xA800);
  373.  
  374. extern pascal void MDVRSignOut(OSType clientID)
  375.  FOURWORDINLINE(0x203C, 0x00B8, 0x0004, 0xA800);
  376.  
  377. extern pascal MDVRPtr MDVROpen(short portType, short refnum)
  378.  FOURWORDINLINE(0x203C, 0x00BC, 0x0004, 0xA800);
  379.  
  380. extern pascal void MDVRClose(MDVRPtr driverPtr)
  381.  FOURWORDINLINE(0x203C, 0x00C0, 0x0004, 0xA800);
  382.  
  383. extern pascal void MDVRControlIn(MDVRPtr portPtr, MDVRInCtlPtr inputCtl)
  384.  FOURWORDINLINE(0x203C, 0x00C4, 0x0004, 0xA800);
  385.  
  386. extern pascal void MDVRControlOut(MDVRPtr portPtr, MDVROutCtlPtr outputCtl)
  387.  FOURWORDINLINE(0x203C, 0x00C8, 0x0004, 0xA800);
  388.  
  389. extern pascal void MDVRIn(MDVRPtr portPtr)
  390.  FOURWORDINLINE(0x203C, 0x00CC, 0x0004, 0xA800);
  391.  
  392. extern pascal void MDVROut(MDVRPtr portPtr, char *dataPtr, short length)
  393.  FOURWORDINLINE(0x203C, 0x00D0, 0x0004, 0xA800);
  394.  
  395. extern pascal void MDVRNotesOff(MDVRPtr portPtr, short mode)
  396.  FOURWORDINLINE(0x203C, 0x00D4, 0x0004, 0xA800);
  397.  
  398.  
  399. enum {
  400.     uppMIDIReadHookProcInfo = kPascalStackBased
  401.          | RESULT_SIZE(SIZE_CODE(sizeof(short)))
  402.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(MIDIPacketPtr)))
  403.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long))),
  404.     uppMIDITimeProcInfo = kPascalStackBased
  405.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  406.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long))),
  407.     uppMIDIConnectionProcInfo = kPascalStackBased
  408.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
  409.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
  410.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(short)))
  411.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(OSType)))
  412.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(OSType)))
  413.          | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(Boolean)))
  414.          | STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(short))),
  415.     uppMDVRCommProcInfo = kPascalStackBased
  416.          | RESULT_SIZE(SIZE_CODE(sizeof(long)))
  417.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
  418.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
  419.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long))),
  420.     uppMDVRTimeCodeProcInfo = kPascalStackBased
  421.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
  422.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
  423.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long))),
  424.     uppMDVRReadProcInfo = kPascalStackBased
  425.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(char *)))
  426.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(short)))
  427.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long)))
  428. };
  429.  
  430. #if GENERATINGCFM
  431. #define NewMIDIReadHookProc(userRoutine)        \
  432.         (MIDIReadHookUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMIDIReadHookProcInfo, GetCurrentArchitecture())
  433. #define NewMIDITimeProc(userRoutine)        \
  434.         (MIDITimeUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMIDITimeProcInfo, GetCurrentArchitecture())
  435. #define NewMIDIConnectionProc(userRoutine)        \
  436.         (MIDIConnectionUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMIDIConnectionProcInfo, GetCurrentArchitecture())
  437. #define NewMDVRCommProc(userRoutine)        \
  438.         (MDVRCommUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMDVRCommProcInfo, GetCurrentArchitecture())
  439. #define NewMDVRTimeCodeProc(userRoutine)        \
  440.         (MDVRTimeCodeUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMDVRTimeCodeProcInfo, GetCurrentArchitecture())
  441. #define NewMDVRReadProc(userRoutine)        \
  442.         (MDVRReadUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppMDVRReadProcInfo, GetCurrentArchitecture())
  443. #else
  444. #define NewMIDIReadHookProc(userRoutine)        \
  445.         ((MIDIReadHookUPP) (userRoutine))
  446. #define NewMIDITimeProc(userRoutine)        \
  447.         ((MIDITimeUPP) (userRoutine))
  448. #define NewMIDIConnectionProc(userRoutine)        \
  449.         ((MIDIConnectionUPP) (userRoutine))
  450. #define NewMDVRCommProc(userRoutine)        \
  451.         ((MDVRCommUPP) (userRoutine))
  452. #define NewMDVRTimeCodeProc(userRoutine)        \
  453.         ((MDVRTimeCodeUPP) (userRoutine))
  454. #define NewMDVRReadProc(userRoutine)        \
  455.         ((MDVRReadUPP) (userRoutine))
  456. #endif
  457.  
  458. #if GENERATINGCFM
  459. #define CallMIDIReadHookProc(userRoutine, myPacket, myRefCon)        \
  460.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMIDIReadHookProcInfo, (myPacket), (myRefCon))
  461. #define CallMIDITimeProc(userRoutine, curTime, myRefCon)        \
  462.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMIDITimeProcInfo, (curTime), (myRefCon))
  463. #define CallMIDIConnectionProc(userRoutine, refnum, refcon, portType, clientID, portID, connect, direction)        \
  464.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMIDIConnectionProcInfo, (refnum), (refcon), (portType), (clientID), (portID), (connect), (direction))
  465. #define CallMDVRCommProc(userRoutine, refnum, request, refCon)        \
  466.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMDVRCommProcInfo, (refnum), (request), (refCon))
  467. #define CallMDVRTimeCodeProc(userRoutine, refnum, newFormat, refCon)        \
  468.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMDVRTimeCodeProcInfo, (refnum), (newFormat), (refCon))
  469. #define CallMDVRReadProc(userRoutine, midiChars, length, refCon)        \
  470.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppMDVRReadProcInfo, (midiChars), (length), (refCon))
  471. #else
  472. #define CallMIDIReadHookProc(userRoutine, myPacket, myRefCon)        \
  473.         (*(userRoutine))((myPacket), (myRefCon))
  474. #define CallMIDITimeProc(userRoutine, curTime, myRefCon)        \
  475.         (*(userRoutine))((curTime), (myRefCon))
  476. #define CallMIDIConnectionProc(userRoutine, refnum, refcon, portType, clientID, portID, connect, direction)        \
  477.         (*(userRoutine))((refnum), (refcon), (portType), (clientID), (portID), (connect), (direction))
  478. #define CallMDVRCommProc(userRoutine, refnum, request, refCon)        \
  479.         (*(userRoutine))((refnum), (request), (refCon))
  480. #define CallMDVRTimeCodeProc(userRoutine, refnum, newFormat, refCon)        \
  481.         (*(userRoutine))((refnum), (newFormat), (refCon))
  482. #define CallMDVRReadProc(userRoutine, midiChars, length, refCon)        \
  483.         (*(userRoutine))((midiChars), (length), (refCon))
  484. #endif
  485. #endif
  486.  
  487. #if PRAGMA_ALIGN_SUPPORTED
  488. #pragma options align=reset
  489. #endif
  490.  
  491. #if PRAGMA_IMPORT_SUPPORTED
  492. #pragma import off
  493. #endif
  494.  
  495. #ifdef __cplusplus
  496. }
  497. #endif
  498.  
  499. #endif /* __MIDI__ */
  500.  
  501.